package com.tangruojie.stream;

import com.tangruojie.entity.Author;
import com.tangruojie.entity.Book;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 终结操作之 collect 收集 -> 流转集合
 */
public class StreamDemo12 {

    public static void main(String[] args) {

        List<Author> authors = StreamDemoTest.getAuthors();

        /**
         * 获取一个存放所有作者名字的 List 集合
         */
        List<String> list = authors.stream()
                .map(Author::getName)
                .distinct()
                .collect(Collectors.toList());
        System.out.println(list);

        /**
         * 获取一个存放所有书籍名字的 Set 集合
         */
        Set<String> set = authors.stream()
                .flatMap(author -> author.getBooks().stream())
                .map(Book::getName)
                .collect(Collectors.toSet());
        System.out.println(set);

        /**
         * 获取一个 key 存放作者名，value 存放 List<Book> 的 Map 集合
         */
        Map<String, List<String>> map = authors.stream()
                .distinct()
                .collect(Collectors.toMap(
                        Author::getName,
                        new Function<Author, List<String>>() {
                            @Override
                            public List<String> apply(Author author) {
                                return author.getBooks().stream()
                                        .map(Book::getName)
                                        .distinct()
                                        .collect(Collectors.toList());
                            }
                        }
                ));
        System.out.println(map);

    }

}
/**
 * Collectors 就是 Java Stream 的“结果收割机”，你想要什么结果，它都能帮你收集、转换、分组、拼接、分析。
 * 方法	                    功能
 * toList()	                收集为 List
 * toSet()	                收集为 Set
 * toMap()	                收集为 Map
 * joining()	            拼接字符串
 * counting()	            计数
 * summarizingInt()	        一次性获得总和/平均值/最大值等
 * averagingInt()	        求平均值
 * summingInt()	            求和
 * maxBy() / minBy()	    求最大值/最小值
 * groupingBy()	            分组
 * partitioningBy()	        按布尔条件分区
 * mapping()	            嵌套映射使用（在 groupingBy 中很常用）
 * collectingAndThen()	    对收集结果进一步加工
 */